package messages

import (
	"bytes"
	"crypto/tls"
	"encoding/json"
	"fmt"
	"gitee.com/captials-team/ubdframe/src/domain/configstc"
	"io"
	"net/http"
	"time"
)

// WeComRobotSender 企业微信机器人
// 详见官方文档：https://developer.work.weixin.qq.com/document/path/91770
type WeComRobotSender struct {
	cnf configstc.WebHookConfig

	client *http.Client
}

func NewWeComRobotSender(cnf configstc.WebHookConfig) *WeComRobotSender {
	client := &http.Client{
		Timeout: 3 * time.Second,
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
		},
	}

	return &WeComRobotSender{
		cnf:    cnf,
		client: client,
	}
}

// SendText 发送文本
func (s *WeComRobotSender) SendText(message string, atUsers []string, atMobiles []string) error {
	_, err := s.OriginSend(map[string]interface{}{
		"msgtype": "text",
		"text": map[string]interface{}{
			"content":               message,   //内容
			"mentioned_list":        atUsers,   //userid的列表，提醒群中的指定成员(@某个成员)，@all表示提醒所有人，如果开发者获取不到userid，可以使用mentioned_mobile_list
			"mentioned_mobile_list": atMobiles, //手机号列表，提醒手机号对应的群成员(@某个成员)，@all表示提醒所有人
		},
	})
	return err
}

// SendMarkdown 发送Markdown
func (s *WeComRobotSender) SendMarkdown(message string) error {
	_, err := s.OriginSend(map[string]interface{}{
		"msgtype": "markdown",
		"markdown": map[string]interface{}{
			"content": message, //内容
		},
	})
	return err
}

// SendImage 发送图片
func (s *WeComRobotSender) SendImage(image string, md5s ...string) error {
	var md5 string
	if len(md5s) > 0 {
		md5 = md5s[0]
	}
	_, err := s.OriginSend(map[string]interface{}{
		"msgtype": "image",
		"image": map[string]interface{}{
			"base64": image, //图片内容的base64编码
			"md5":    md5,   //图片内容（base64编码前）的md5值
		},
	})
	return err
}

// SendNews 发送图文
func (s *WeComRobotSender) SendNews(items ...WeComNewsItem) error {
	_, err := s.OriginSend(map[string]interface{}{
		"msgtype": "news",
		"news": map[string]interface{}{
			"articles": items, //图文消息，一个图文消息支持1到8条图文
		},
	})
	return err
}

// SendMedia 发送图文
func (s *WeComRobotSender) SendMedia(mediaId string) error {
	_, err := s.OriginSend(map[string]interface{}{
		"msgtype": "voice",
		"voice": map[string]interface{}{
			"media_id": mediaId, //语音文件id，通过文件上传接口获取
		},
	})
	return err
}

// SendTemplateCardText 发送文本模板卡片
func (s *WeComRobotSender) SendTemplateCardText() error {
	return fmt.Errorf("not support")
}

// SendTemplateCardNews 发送图文模板卡片
func (s *WeComRobotSender) SendTemplateCardNews() error {
	return fmt.Errorf("not support")
}

func (s *WeComRobotSender) OriginSend(params map[string]interface{}) ([]byte, error) {
	reqBody, err := json.Marshal(params)
	if err != nil {
		return nil, err
	}
	req, err := http.NewRequest(http.MethodPost, s.cnf.Url, bytes.NewReader(reqBody))
	if err != nil {
		return nil, err
	}
	req.Header.Add("Content-Type", "application/json")
	resp, err := s.client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	return body, nil
}

type WeComNewsItem struct {
	Title       string `json:"title"`       // 标题，不超过128个字节，超过会自动截断
	Description string `json:"description"` // 描述，不超过512个字节，超过会自动截断
	Url         string `json:"url"`         // 点击后跳转的链接。
	Picurl      string `json:"picurl"`      //图文消息的图片链接，支持JPG、PNG格式，较好的效果为大图 1068*455，小图150*150。
}
